/**
 * 
 * @brief  bsp_net.h
 * @param  None
 * 
 * @author xhq
 * @date   2024/11/05
 * 
 */
#ifndef __SRC_FUNCTION_H__
#define __SRC_FUNCTION_H__

/* include */
#include <stdio.h>
#include <math.h>
#include <bits/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include "typedef.h"
#include "global_variables.h"

/* define */
#define CHECK_TYPE_NONE             0x00
#define CHECK_TYPE_BCC              0x01
#define CHECK_TYPE_CRC              0x02
#define UDP_RECV_BUFF_SIZE          1500

/* 参数字段定义 */
#define TAG_RW_FLAG_R       0   // 读指令
#define TAG_RW_FLAG_W       1   // 写指令
#define TAG_RS_FLAG_R       0   // 上位机 -> 雷达
#define TAG_RS_FLAG_S       1   // 雷达 -> 上位机

/* typedef */
/* IP协议 */
typedef enum
{
    IPV4_PROTOCOL = 0,
    IPV6_PROTOCOL,
    IP_PROTOCOL_MAX
}net_protocol_type;
/* 网络传输协议 */
typedef enum
{
    UDP=1,
    TCP
} socket_type_etype;

/* 主指令 */
typedef enum
{
    TAG_TYPE_NO_USE                   =   0x0000,     // 未使用
    TAG_TYPE_RAW_DATA                 =   0x0001,     // 原始数据
    TAG_TYPE_VERSION                  =   0x0004,     // 版本信息
    TAG_TYPE_STATUS_INFO              =   0x0005,     // 设备状态
    TAG_TYPE_CONTROL                  =   0x0006,     // 设备控制指令
    TAG_TYPE_NET                      =   0x0007,     // 设备网络参数
    TAG_TYPE_LIDAR_BASE_PARAM         =   0x0008,     // 雷达基本参数
    TAG_TYPE_LIDAR_DEBUG_PARAM        =   0x0009,     // 雷达调试参数
    TAG_TYPE_MAX
} tag_TYPE_etype;
/* 子指令 */
// 0x0001 原始数据
typedef enum
{
    TAG_SUBID_OBJECT_INFO             =   0x0001,     // 目标信息
    TAG_SUBID_RAW_DEBUG_DATA          =   0x0002,     // 目标信息
    TAG_TYPE_RAW_DATA_SUBID_MAX
} tag_type_raw_data_subid_etype;

// 0x0004 版本信息
typedef enum
{
    TAG_SUBID_PROTOCOL_VERSION        =   0x0001,     // 协议版本
    TAG_TYPE_VERSION_SUBID_MAX
} tag_type_version_subid_etype;
// 0x0005 设备状态信息
typedef enum
{
    TAG_SUBID_WORK_STATE              =   0x0001,     // 工作状态
    TAG_TYPE_STATUS_INFO_SUBID_MAX
} tag_type_status_info_subid_etype;
// 0x0006 设备控制参数
typedef enum
{
    TAG_SUBID_REBOOT                  =   0x0001,     // 设备重启
    TAG_SUBID_CLEAR_REBOOT_INFO       =   0x0002,     // 重启信息清零
    TAG_SUBID_BC_RESTORE_NET_PARAM    =   0x0003,     // 广播恢复网络参数
    TAG_SUBID_BC_DEVICE_INFO_PARAM    =   0x0004,     // 广播设备信息参数
    TAG_TYPE_CONTROL_SUBID_MAX
} tag_type_control_subid_etype;
// 0x0007 设备网络参数
typedef enum
{
    TAG_SUBID_NET_PROTOCOL              =   0x0001,     // 当前网络协议 ipv4/ipv6
    TAG_SUBID_NET_SPEED                 =   0x0002,     // 网速
    TAG_SUBID_LOCAL_IP_IPV4             =   0x0003,     // 本地 ipv4 地址
    TAG_SUBID_LOCAL_MASK_IPV4           =   0x0004,     // 本地 ipv4 子网掩码
    TAG_SUBID_LOCAL_GATEWAY_IPV4        =   0x0005,     // 本地 ipv4 网关
    TAG_SUBID_LOCAL_UDP_CMD_DATA_PORT   =   0x0006,     // 本地 udp cmd data 端口
    TAG_SUBID_DEST_UDP_CMD_DATA_PORT    =   0x0007,     // 目标 udp cmd data 端口
    TAG_SUBID_DEST_IP_IPV4              =   0x0008,     // 目标 ipv4 地址
    TAG_SUBID_LOCAL_MASK_IPV6           =   0x0009,     // 本地 ipv6 子网掩码
    TAG_SUBID_LOCAL_GATEWAY_IPV6        =   0x000a,     // 本地 ipv6 网关
    TAG_SUBID_LL_IP_IPV6                =   0x000b,     // 本地 ipv6 LLA地址
    TAG_SUBID_LG_IP_IPV6                =   0x000c,     // 本地 ipv6 GUA地址
    TAG_SUBID_DEST_IP_IPV6              =   0x000d,     // 目标 ipv6 地址
    TAG_SUBID_MAC                       =   0x000e,     // MAC 地址
    TAG_TYPE_NET_SUBID_MAX
} tag_type_net_subid_etype;
// 0x0008 雷达基本参数
typedef enum
{
    TAG_SUBID_SN                    =   0x0001,     // sn 号
    TAG_SUBID_ACCUMULATOR_TEST_EN   =   0x0002,     // 累加数测试使能
    TAG_SUBID_DEVICE_ID             =   0x0003,     // 设备ID
    TAG_SUBID_MANUFACTURER          =   0x0004,     // 设备厂商名称
    TAG_SUBID_DEVICE_TYPE           =   0x0005,     // 设备型号
    TAG_TYPE_LIDAR_BASE_PARAM_SUBID_MAX
} tag_type_lidar_base_param_subid_etype;
// 0x0009 雷达调试参数
typedef enum
{
    TAG_SUBID_GET_ARM_DEBUG_PARAM       =   0x0001,     // 获取arm调试参数
    TAG_SUBID_SET_ARM_DEBUG_PARAM       =   0x0002,     // 配置arm调试参数
    TAG_TYPE_LIDAR_DEBUG_PARAM_SUBID_MAX
} tag_type_lidar_debug_param_subid_etype;

/* function */
uint32_t get_net_param_from_ini(ini_net_info_type *ini_net_info);
uint32_t save_net_param_to_ini(ini_net_info_type *ini_net_info);

uint32_t net_modules_init();
static uint32_t ipv4_ipv6_ip_socket_init(uint8_t l_socket_type);
static uint32_t socket_modules_init(socket_info_type * socket_info);

/* net recv / send */
uint32_t net_send_udp_data(uint8_t *send_buf, uint32_t send_len, struct sockaddr * sockaddr, uint32_t socket_flag);
#endif